package Cliente;

/*
 * ClienteNTask.java
 *
 * Created on 05-may-2009, 18:22:00
 */

import org.omg.CORBA.ORB;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import java.util.Vector;
import java.util.Iterator;
import javax.swing.table.DefaultTableModel;
import Servidor.*;
import javax.swing.JOptionPane;

/**
 *Clase principal para los clientes. Se encarga de conectar con
 * el servidor y de toda la comunicacion con &eacute;l.
 * 
 * @author Juan Manuel Lora Muñoz
 */
public class ClienteNTask extends javax.swing.JFrame {
    static String[] argumentos;
    NTaskClientImpl ntClient;
    NTaskServer ntServer;
    private Vector listaTareas = new Vector();
    NTaskClient ref;

    //Para saber el numero de filas rellenas en la tabla
    int nFilasRellenas = 0;

    //Para saber el identificador de las tareas, debe ser unico
    int id = 0;

    
    /** Constructor de la clase */
    public ClienteNTask() {
        initComponents();              
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        b_Conectar = new javax.swing.JButton();
        tf_Nombre = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        ta_Retorno = new javax.swing.JTextArea();
        b_EnviarTarea = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        tablaTareas = new javax.swing.JTable();
        b_Eliminar = new javax.swing.JButton();
        b_VerTarea = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("NetTask");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                salir(evt);
            }
        });

        b_Conectar.setText("Conectar");
        b_Conectar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_ConectarActionPerformed(evt);
            }
        });

        tf_Nombre.setText("Nombre");
        tf_Nombre.setToolTipText("Introduzca el nombre con el que se conecta");

        ta_Retorno.setColumns(20);
        ta_Retorno.setRows(5);
        jScrollPane1.setViewportView(ta_Retorno);

        b_EnviarTarea.setText("Enviar Tarea");
        b_EnviarTarea.setToolTipText("Abre el diálogo para enviar una tarea");
        b_EnviarTarea.setEnabled(false);
        b_EnviarTarea.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_EnviarTareaActionPerformed(evt);
            }
        });

        tablaTareas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Estado", "Fecha Inicio", "Fecha Fin", "Titulo", "Creador", "Responsable", "Mensaje"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaTareas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaTareasMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(tablaTareas);
        tablaTareas.getColumnModel().getColumn(0).setMinWidth(35);
        tablaTareas.getColumnModel().getColumn(0).setPreferredWidth(35);
        tablaTareas.getColumnModel().getColumn(0).setMaxWidth(55);

        b_Eliminar.setText("Eliminar Tarea");
        b_Eliminar.setEnabled(false);
        b_Eliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_EliminarActionPerformed(evt);
            }
        });

        b_VerTarea.setText("Ver Tarea");
        b_VerTarea.setEnabled(false);
        b_VerTarea.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                b_VerTareaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(tf_Nombre, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(b_Conectar))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 847, Short.MAX_VALUE)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 847, Short.MAX_VALUE))
                            .addContainerGap()))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(b_EnviarTarea)
                        .addGap(18, 18, 18)
                        .addComponent(b_Eliminar)
                        .addGap(18, 18, 18)
                        .addComponent(b_VerTarea)
                        .addGap(82, 82, 82))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 343, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(b_EnviarTarea)
                    .addComponent(b_Eliminar)
                    .addComponent(b_VerTarea))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 27, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tf_Nombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(b_Conectar))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * M&eacute;todo llamado al pulsar el bot&oacute;n "Conectar".
     * Llama al m&eacute;todo "conectar" de esta misma clase
     * pasandole como argumentos los argumentos de la linea de
     * comandos y el nombre introducido en la caja de texto correspondiente.
     * Si consigue conectar, cambia el t&iacute;tulo de la ventana
     * añadi&eacute;ndole el nombre del usuario y muestra un mensaje en el
     * &aacute;rea de texto correspondiente.
     *
     * @param evt Evento del bot&oacute;n.
     * @see conectar
     */
    private void b_ConectarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_ConectarActionPerformed
        // TODO add your handling code here:
       //cli = new Client(this);
       if (conectar(argumentos, tf_getText())){
           ta_setText("Conectado como: "+getUser());

           //Cambiamos el nombre de la ventana
           this.setTitle(this.getTitle()+" - " +getUser());

           //Desactivamos el boton de conectar y activamos los otros tres botones
           this.b_Conectar.setEnabled(false);
           this.b_Eliminar.setEnabled(true);
           this.b_EnviarTarea.setEnabled(true);
           this.b_VerTarea.setEnabled(true);
            }
       else
           ta_setText("Error al conectar.");

    }//GEN-LAST:event_b_ConectarActionPerformed

    /**
     * Método llamado cuando se pulsa el bot&oacute;n "Enviar tarea".
     * Este m&eacute;todo crea una nueva ventana de la clase "EnviarTarea"
     * pas&aacute;ndole el objeto de esta clase ("vCliente").
     *
     * @param evt Evento creado al pulsar el bot&oacute;n.
     */
    private void b_EnviarTareaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_EnviarTareaActionPerformed
        // TODO add your handling code here:
        EnviarTareaForm fEnv = new EnviarTareaForm(this);
        fEnv.setVisible(true);
    }//GEN-LAST:event_b_EnviarTareaActionPerformed


    /**
     * M&eacute;todo que hace que el cliente se desconecte del servidor
     * antes de salir
     * @param evt
     */
    private void salir(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_salir
        // TODO add your handling code here:
        ntServer.logout(ref);
        dispose();
        System.exit(0);
    }//GEN-LAST:event_salir

    
    /**
     * Elimina una tarea de la lista. Para ello debe estar seleccionada una 
     * fila previamente.
     * 
     * @param evt
     */
    private void b_EliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_EliminarActionPerformed
        // TODO add your handling code here:
        int nfila = tablaTareas.getSelectedRow();
        
        if (nfila >=0){
            if (JOptionPane.showConfirmDialog(null,
                    "¿Desea eliminar la tarea?",
                    "Se va a eliminar la tarea, ¿continuar?",
                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION )
            {
            
                //Eliminamos el objeto de la lista
                listaTareas.remove(nfila);
                nFilasRellenas--;

                //Eliminamos la fila de la tabla
                DefaultTableModel modelo = (DefaultTableModel)tablaTareas.getModel();
                modelo.removeRow(nfila);
            }
        }
}//GEN-LAST:event_b_EliminarActionPerformed

    /**
     * Acciones que se ejecutan cuando se pulsa el boton "Ver Tarea". Busca la
     * tarea correspondiente a la fila seleccionada y luego llama al formulario
     * "VerTareaForm" pas&aacute;ndole un objeto Tarea correspondiente.
     * 
     * @param evt
     */
    private void b_VerTareaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_b_VerTareaActionPerformed
        // TODO add your handling code here:
        int nfila = tablaTareas.getSelectedRow();

        if (nfila >=0){

            //Conversion a entero del objeto devuelto en la celda
            int idBuscado = Integer.parseInt((String)tablaTareas.getValueAt(nfila, 0));

            Tarea tarea = getTarea(idBuscado);

            if (tarea != null){
                VerTareaForm visor = new VerTareaForm(tarea);
                visor.setVisible(true);
            }
            else
                JOptionPane.showMessageDialog(null,
                    "Tarea no encontrada",
                    "No se ha encontrado la tarea especificada",
                    JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_b_VerTareaActionPerformed

    /**
     * Ejecutado cuando se pulsa dos veces sobre una fila de la tarea.
     * Llama al mismo m&eacute;todo que cuando se pulsa el bot&oacute;n
     * "Ver Tarea".
     * 
     * @param evt
     */
    private void tablaTareasMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaTareasMouseClicked
        // TODO add your handling code here:
        if (evt.getClickCount() == 2){
            b_VerTareaActionPerformed(null);
         }


    }//GEN-LAST:event_tablaTareasMouseClicked

    /**
    * @param argumentos de la l&iacute;nea de comandos.
     *           args[1]: valor para -ORBInitialPort
     *           args[3]: valor para -ORBInitialHost
    */
    @SuppressWarnings("static-access")
    public static void main(String args[]) {
        argumentos = args;

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                ClienteNTask ntCli = new ClienteNTask();
                ntCli.setVisible(true);
                
            }
            
        });
    }


    /**
     * Inserta una l&iacute;nea en el &aacute;rea de texto
     * "ta_Retorno" destinada a mostrar los eventos del sistema.
     *
     * @param texto Texto de la l&iacute;nea que se añade.
     */
 public void ta_setText(String texto){
    ta_Retorno.append(texto+"\n");
}

 /**
 * Recoge el texto de la caja de texto "tf_Nombre" destinada a
 * escribir el nombre con el que se conecta el usuario.
 *
 * @return Devuelve una cadena con el texto de la caja.
 */
 private String tf_getText(){
    return tf_Nombre.getText();
 }

/**
 * Realiza todas las acciones necesarias para conectar con el
 * servidor. Muestra mensajes en el &aacute;rea de texto
 * "ta_Retorno".
 *
 * @param args Los argumentos de la línea de comandos.
 * @param nombre El nombre con el que se conecta el cliente.
 * @return "True" si ha conseguido conectar. "False" en otro caso.
 */
 public boolean conectar(String[] args, String nombre) {
  try { 

      //Inicializa el orb
       ORB orb = ORB.init(args, null);
    
      ta_setText("ORB Inicializado");

        //Instancia el objeto NTaskClient y crea una referencia al mismo
	  POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
      ntClient= new NTaskClientImpl(this);
      ntClient.setUserID(nombre);
      rootPOA.activate_object(ntClient);
	  ref = NTaskClientHelper.narrow(rootPOA.servant_to_reference(ntClient));
      
      //Invoca al objeto del servidor MessageServer
      //  args[1] debe ser el puerto
      //  args[3] debe ser el host (localhost)
      String cadena;
      cadena = "corbaname:iiop:1.2@"+args[3]+":"+args[1]+"#NTaskServer";
      ntServer= NTaskServerHelper.narrow(
              orb.string_to_object(cadena));

      //Registra la referencia al objeto "NTaskClient"
      //(el objeto callback) a través del MessageServer
      if (ntServer.register(ref)) {
        ta_setText("NTaskClient registrado en NTaskServer");

        //Activa rootpoa
        rootPOA.the_POAManager().activate();

        //Espera las llamadas de los clientes
        //ta_setText("Esperando llamadas de clientes...");

        return true;
        }
      else {
        ta_setText("No se ha podido registrar en el servidor");
        return false;}


	} catch (Exception e) {
	    e.printStackTrace();
        return false;
	}
    }

 /**
  * Devuelve el nombre de usuario utilizado para conectar.
  *
  * @return Cadena con el nombre del usuario
  */
    public String getUser() {
        if (ntClient != null)
            return ntClient.getUserID();
        else
             return "";
    }

    /**
     * Invoca al m&eacute;todo "enviarTarea" implementado en el servidor.
     *
     * @param destino Cadena con el nombre de usuario del destinatario
     * @param msg Cadena con el mensaje que se env&iacute;a
     */
    public void enviarTarea(String estado, String fechaInicio, String fechaFin, String titulo,
            String mensaje, String creador, String responsable, String destino)
    {        
        ntServer.enviarTarea(estado, fechaInicio, fechaFin, titulo, mensaje, creador,
                    responsable, destino);
    }

    /**
     * M&eacute;todo llamado cuando se recibe una tarea. Añade la tarea a la lista
     * de tareas. Es llamada desde la clase 'NTaskClientImpl'. Busca la primera fila
     * libre de la tabla e inserta los valores. Inserta el objeto de tipo Tarea
     * en el vector "listaTareas".
     *
     * @param estado Estado de la tarea recibido
     * @param fechaInicio Fecha de inicio de la tarea recibida.
     * @param fechaFin Fecha de fin de la tarea recibida.
     * @param titulo T&iacute;tulo de la tarea recibida.
     * @param mensaje Mensaje recibido
     * @param creador Creador de la tarea
     * @param responsable Persona responsable de la tarea
     */
    public void recibirTarea(String estado, String fechaInicio, String fechaFin, String titulo,
            String mensaje, String creador, String responsable)
    {
        ta_setText("Tarea recibida");

        //Creamos un objeto Tarea y lo añadimos a la lista
        Tarea tareatmp = new Tarea(id, estado, fechaInicio, fechaFin, titulo, mensaje,
                creador, responsable);

        id++; //Se actualiza el identificador

        listaTareas.add(tareatmp);

        //Actualizamos la tabla
        DefaultTableModel modelo = (DefaultTableModel)tablaTareas.getModel();

        String[] nuevaFila = {tareatmp.getId().toString(), tareatmp.getEstado(),
                                tareatmp.getFechaInicio(),
                                tareatmp.getFechaFin(), titulo, creador,
                                responsable, mensaje};
        modelo.addRow(nuevaFila);
        
        nFilasRellenas++;

    }


    /**
     * Busca una tarea especificada mediante su identificador en la lista de
     * tareas del cliente
     *
     * @param pid ID de la tarea que se busca
     *
     * @return Devuelve el objeto Tarea si la encuentra o null en otro caso
     */
    public Tarea getTarea(int pid)
    {
        for (Iterator t=listaTareas.iterator(); t.hasNext();)
        {
            Tarea tmp = (Tarea)t.next();

            if (tmp.getId() == pid)
                return tmp;
            
        }

        return null;


    }



    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton b_Conectar;
    private javax.swing.JButton b_Eliminar;
    private javax.swing.JButton b_EnviarTarea;
    private javax.swing.JButton b_VerTarea;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea ta_Retorno;
    private javax.swing.JTable tablaTareas;
    private javax.swing.JTextField tf_Nombre;
    // End of variables declaration//GEN-END:variables

}
